package com.raindrop.rd.parser.match;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;

/**
 * 字符匹配器
 *
 * @author BillDowney
 * @date 2021/3/22 11:25
 */
public class CharMatch {

    /**
     * 数字
     */
    public static final Set<Integer> NUMBER = new LinkedHashSet<Integer>() {
        {
            add((int) '0');
            add((int) '1');
            add((int) '2');
            add((int) '3');
            add((int) '4');
            add((int) '5');
            add((int) '6');
            add((int) '7');
            add((int) '8');
            add((int) '9');
        }
    };

    /**
     * 小写字母
     */
    public static final Set<Integer> LOWER_CASE = new LinkedHashSet<Integer>() {
        {
            add((int) 'a');
            add((int) 'b');
            add((int) 'c');
            add((int) 'd');
            add((int) 'e');
            add((int) 'f');
            add((int) 'g');
            add((int) 'h');
            add((int) 'i');
            add((int) 'j');
            add((int) 'k');
            add((int) 'l');
            add((int) 'm');
            add((int) 'n');
            add((int) 'o');
            add((int) 'p');
            add((int) 'q');
            add((int) 'r');
            add((int) 's');
            add((int) 't');
            add((int) 'u');
            add((int) 'v');
            add((int) 'w');
            add((int) 'x');
            add((int) 'y');
            add((int) 'z');
        }
    };
    /**
     * 大写写字母
     */
    public static final Set<Integer> UPPER_CASE = new LinkedHashSet<Integer>() {
        {
            add((int) 'A');
            add((int) 'B');
            add((int) 'C');
            add((int) 'D');
            add((int) 'E');
            add((int) 'F');
            add((int) 'G');
            add((int) 'H');
            add((int) 'I');
            add((int) 'J');
            add((int) 'K');
            add((int) 'L');
            add((int) 'M');
            add((int) 'N');
            add((int) 'O');
            add((int) 'P');
            add((int) 'Q');
            add((int) 'R');
            add((int) 'S');
            add((int) 'T');
            add((int) 'U');
            add((int) 'V');
            add((int) 'W');
            add((int) 'X');
            add((int) 'Y');
            add((int) 'Z');
        }
    };
    /**
     * 字母集合
     */
    public static final Set<Integer> LETTER = new LinkedHashSet<Integer>() {
        {
            addAll(UPPER_CASE);
            addAll(LOWER_CASE);
        }
    };
    /**
     * 标识符集合
     */
    public static final Set<Integer> IDENTIFIER = new LinkedHashSet<Integer>() {
        {
            addAll(NUMBER);
            addAll(LETTER);
            add((int) '_');
        }
    };

    /**
     * 忽略的字符
     */
    public static final Set<Character> IGNORE_CHARS = new HashSet<Character>() {
        {
            add(' ');
            add('\t');
            add('\r');
            add('\n');
        }
    };

    /**
     * 获取所有的字符ASCII码
     *
     * @return
     */
    public static Set<Integer> getAllChar() {
        Set<Integer> all = new LinkedHashSet<>();
        all.addAll(NUMBER);
        all.addAll(LETTER);
        return all;
    }

    public static void main(String[] args) {
        getAllChar().forEach(integer -> {
            System.out.println(integer + "\t" + ((char) integer.intValue()));
        });
    }

}
